package com.example.demo.service;

import com.example.demo.exception.LibraryException;
import com.example.demo.model.Book;
import com.example.demo.model.User;

/**
 * 图书馆服务接口，定义用户借阅、归还书籍等核心操作.
 */
public interface LibraryService {

    /**
     * 根据用户ID查询用户信息.
     *
     * @param userId 用户ID
     * @return 用户实体
     * @throws LibraryException 用户不存在时抛出异常
     */
    User findUserById(Long userId) throws LibraryException;

    /**
     * 根据书籍ID查询书籍信息.
     *
     * @param bookId 书籍ID
     * @return 书籍实体
     * @throws LibraryException 书籍不存在时抛出异常
     */
    Book findBookById(Long bookId) throws LibraryException;

    /**
     * 用户借阅书籍.
     *
     * @param user 用户实体
     * @param book 书籍实体
     * @throws LibraryException 借阅失败时抛出异常（如库存不足、借阅超限等）
     */
    void borrowBook(User user, Book book) throws LibraryException;

    /**
     * 用户归还书籍并计算逾期费用.
     *
     * @param user 用户实体
     * @param book 书籍实体
     * @param overdueDays 逾期天数
     * @return 逾期费用（若无逾期则返回0）
     * @throws LibraryException 归还失败时抛出异常（如未借阅此书）
     */
    double returnBook(User user, Book book, int overdueDays) throws LibraryException;

        // 其他方法...

        /**
         * 用户通过ID借阅书籍.
         *
         * @param userId 用户ID
         * @param bookId 书籍ID
         * @throws LibraryException 借阅失败时抛出异常
         */
        void borrowBookById(Long userId, Long bookId) throws LibraryException;

    /**
     * 添加用户到书籍的等待队列（当书籍不可借阅时）.
     *
     * @param book 书籍实体
     * @param user 用户实体
     * @throws LibraryException 添加失败时抛出异常（如用户已在队列中）
     */
    void addWaitingUser(Book book, User user) throws LibraryException;


}
